/**
* @Author: zou.yingbin
* @Create  : 2020/9/10 11:42
* @Modify  : 2020/9/10 11:42
 */

//const unsigned char MSG_SUBSCRIPTION_REQ            = 0x20;
/************行情协议格式************************************
标识	            类型	字节数	内容	说明
HeadTag	        byte	1	0xFF	头标记
Length	        uint	4		包总长度
TypeMain	    byte	1		大类
TypeSecond	    []byte	2		小类
SerialNumber	uint	4		通讯报文序号
Mode	        byte	1		内容类型，0, 自定义格式,没什么用
Version	        byte	1		版本号
数据体				业务结构体，自定义格式
FootTag	        byte	1	0x00	尾标记

数据体前,包头长度=14, 空包长度=15
行情订阅数据体
accountid       []byte  8       账户id(loginid)
token           []byte  64      令牌
goodscount      uint    4       商品数量
repeated{
   istatus      byte    1       订阅状态
   exchangeid   byte    1       交易所id
   goodscode    []byte  64      商品代码
}
*******************************************************/

package main

import (
	"fmt"
)

type MiQuotePacket struct {
	Length    uint32
	BigType   byte
	SmallType uint16
	SerialNum uint32
	Mode      byte
	Msg       []byte
}

func (r *MiQuotePacket) EnPack() []byte {
	r.Length = uint32(len(r.Msg)) + 15
	buf := make([]byte, 0)
	buf = append(buf, byte(0xFF))
	buf = append(buf, UintTobytesBigEnd(r.Length)...)
	buf = append(buf, byte(r.BigType))
	buf = append(buf, Uint16TobytesBigEnd(r.SmallType)...)
	buf = append(buf, UintTobytesBigEnd(r.SerialNum)...)
	buf = append(buf, byte(0))
	buf = append(buf, byte(0))
	buf = append(buf, r.Msg...)
	buf = append(buf, byte(0))

	return buf
}

func (r *MiQuotePacket) UnPackHead(buf []byte) error {
	if len(buf) != 14 {
		return fmt.Errorf("header len error")
	}

	if buf[0] != 0xFF {
		return fmt.Errorf("header flag error")
	}

	r.Length = BytesBigEndToUint32(buf[1:5])
	r.BigType = buf[5]
	r.SmallType = BytesBigEndToUint16(buf[6:8])
	r.SerialNum = BytesBigEndToUint32(buf[8:12])
	r.Mode = buf[12]

	return nil
}

func MakeQuotePacket(bigType byte, smallType uint16, serialNum uint32, msgData []byte) []byte {
	p := new(MiQuotePacket)
	p.BigType = bigType
	p.SmallType = smallType
	p.SerialNum = serialNum
	p.Msg = msgData
	return p.EnPack()
}
